package it.pdm.mep;


import it.mediaplayer.mep.R;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.w3c.dom.Document;

import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;

import android.os.AsyncTask;
import android.os.Bundle;

import android.os.Handler;

import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;


public class Mp3Activity extends Activity {

	private ImageButton buttonPlay; //Pulsanti per il Play/Pause e Stop
	private ImageButton buttonStop;
	
	
	private MediaPlayer mediaPlayer; // Classe per riprodurre il file audio
	private SeekBar seekBar;
	private boolean play = true; //Controlla se la canzone è in riproduzione o meno
	private String path = null;
	
	private final Handler handler = new Handler(); //Handler che si occupa del trasferimento di messaggi per il runnuble che modifica lo stato della SeekBar
	private static String LAST_FM_API_KEY = "api_key=d39c70e561e2095d8f0ea4f0ee6db60c"; //Chiave per effettuare la ricerca su lastfm
	
	private static Bitmap cover; //Tag principali, se è un file su disco sono i Tag del file audio, 
	private String album;
	private String artist;
	private String title;
	private String year;
	
	private String xml = ""; // Risultato della Query in formato xml
	
	private String tempalbum ; //Parametri della Query immessi dall'utente
	private String tempartist;
	private String temptitle ;
	private String tempyear ;
	
	private static Bitmap img; //Risultati della Query che se vengono confermati sono assegnati alle variabili principale dei Tag 
	private String newAlbum; 
	private String newArtist;
	private String newTitle;
	private String newImagePath;
	
	
	private String link_song = null; //Link della canzone da ascoltare in streaming
	private String percorso = null; //Parh su disco del file da eseguire
	private boolean ricercaFinita = false; // Controlla se la Query su lastfm è terminata

	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setContentView(R.layout.mp3_layout);

		percorso = getIntent().getStringExtra("path");   //prendiamo il percorso passato attraverso la intent chiamata in MediPlayerActivity
		link_song = getIntent().getStringExtra("URL_song"); //prendiamo il link passato attraverso la intent chiamata in MediPlayerActivity

		if (link_song != null) {  //Se link_song è diverso da Null vuol dire che il file audio è in streaming
			
			try {
				mediaPlayer = new MediaPlayer(); // Inizializzo mediaPlayer
				link_song = link_song.replaceAll(" ", "+");
				mediaPlayer.setDataSource(link_song); //Setto la risorsa del file
				mediaPlayer.prepare();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mediaPlayer.start(); // Riproduco il file
		}

		if (percorso != null) { // Se il percorso è diverso da null la canzone è in locale
			path = percorso; // Impostiamo la variabile di classe con il percorso della canzone
			mediaPlayer = new MediaPlayer(); // inizializzo MediaPlayer

			MediaMetadataRetriever mmr = new MediaMetadataRetriever(); //Inizializziamo MediaMetadataRetriever che serve per ricavare i Metadata del File
			mmr.setDataSource(this, getIntent().getData()); //Lo inizializziamo con il percorso del file

			album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); //Ricaco i metadati dal file
			artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
			title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
			year = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);

			TextView titoloView = (TextView) findViewById(R.id.TitoloText); // Faccio vedere a nella Activity i Metadati del file
			titoloView.setText(Html.fromHtml("<b> " +getString(R.string.Title)+"</b> " + title));

			TextView albumView = (TextView) findViewById(R.id.AlbumText);
			albumView.setText(Html.fromHtml("<b>" +getString(R.string.Album)+"</b> " + album));

			TextView annoView = (TextView) findViewById(R.id.AnnoText);
			annoView.setText(Html.fromHtml("<b> " +getString(R.string.Year)+" </b> " + year));

			TextView artistaView = (TextView) findViewById(R.id.AutoreText);
			artistaView.setText(Html.fromHtml("<b> " +getString(R.string.Artist)+" </b> " + artist));

			Bitmap cover = null; 
			byte[] cover_array = mmr.getEmbeddedPicture(); //Prediamo i byte della Cover dell'album dai metadati
			if (cover_array != null) {
				cover = BitmapFactory.decodeByteArray(cover_array, 0,cover_array.length); //Se è diversa l'array di byte è diverso da null da esso ricavo la Bitmap
			}
			ImageView copertina = (ImageView) findViewById(R.id.imageview); // Prendiamo la View immagine e Metto la copertina visibile nell'Activity
			if (cover != null)
				copertina.setImageBitmap(cover);
			mmr.release();
			try {
				mediaPlayer.setDataSource(path); // Inizializziamo il MediaPlayer con il path del file in locale e faccio partire l'ascolto
				mediaPlayer.prepare();
				mediaPlayer.start();

			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		buttonPlay = (ImageButton) findViewById(R.id.PlayButton);
		buttonStop = (ImageButton) findViewById(R.id.StopButton);
		buttonPlay.setOnClickListener(new OnClickListener() { //All'ImageButton buttonPlay gli imposto le sue funzionalità
			@Override
			public void onClick(View v) {
				if (play) {                //Se la canzone è in Play allora devo metterla in pausa e cambiare l'Immagine dell'ImageButton
					play = false;
					mediaPlayer.pause();
					buttonPlay.setImageResource(R.drawable.play_normal);
				} else {                     //Altrimenti è in Pausa/Stop e devo metterla in Play

					try {
						play = true;
						buttonPlay.setImageResource(R.drawable.pause);
						mediaPlayer.start();
						startPlayProgressUpdater();
					} catch (IllegalStateException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		});

		buttonStop.setOnClickListener(new OnClickListener() { // Implementiamo il bottone Stop: ferma la canzone e la posiziona al punto iniziale
			@Override
			public void onClick(View v) {
				play = false;
				buttonPlay.setImageResource(R.drawable.play_normal);
				mediaPlayer.pause();
				mediaPlayer.seekTo(0);
				seekBar.setProgress(0);

			}
		});
		seekBar = (SeekBar) findViewById(R.id.SeekBar); // Utilizziamo la SeekBar per far vedere l'avanzamento della canzone e per posizionare manualmente la posizione di riproduzione
		seekBar.setMax(mediaPlayer.getDuration());
		seekBar.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				seekChange(v); //La funzione implementa lo spostamento della barra
				return false;
			}
		});
		startPlayProgressUpdater(); //La funziona fa vedere l'avanzamento della canzone

	}

	private void seekChange(View v) { //Allo spostramento della Barra cambio la posizione di riproduzione della canzone
		SeekBar sb = (SeekBar) v;
		mediaPlayer.seekTo(sb.getProgress());

	}

	public void startPlayProgressUpdater() {          //Cambia lo stato della barra quando il file multimediale è in riproduzione
		seekBar.setProgress(mediaPlayer.getCurrentPosition()); //Sposta la barra alla posizione corrente della riproduzione

		if (play) {               // Se il MediaPlayer è in Play faccio scorrere la SeeKBar ogni secondo
			Runnable notification = new Runnable() { 
				public void run() {
					startPlayProgressUpdater();
				}
			};
			handler.postDelayed(notification, 1000);
		} else {
			mediaPlayer.pause();                                // Altrimenti è in pausa
			buttonPlay.setImageResource(R.drawable.play_pressed);

		}
	}

	public void onDestroy() {  //Nelle onDestroy(),onPause(),onStop mettiamo in Pausa il mediaPlayer per evitare che si riproduca anche in background
		super.onDestroy();
		mediaPlayer.pause();

		play = false;

	}

	public void onPause() {
		super.onPause();
		mediaPlayer.pause();

		play = false;
	}

	public void onStop() {
		super.onStop();
		mediaPlayer.pause();

		play = false;

	}

	private class LastFmSearch extends AsyncTask<String, Void, String> { //Utilizziamo un AsyncTask per la richiesta Http a lastfm
		@Override
		protected String doInBackground(String... urls) {
			ricercaFinita = false; // La utilizziamo per sapere quando la ricerca è finita così da poter parsare l'xml
			String response = "";
			for (String url : urls) {
				DefaultHttpClient client = new DefaultHttpClient();  //Preparp la richiesta Http
				HttpGet httpGet = new HttpGet(url);
				try {
					HttpResponse execute = client.execute(httpGet);
					InputStream content = execute.getEntity().getContent();

					BufferedReader buffer = new BufferedReader(
							new InputStreamReader(content));
					String s = "";
					while ((s = buffer.readLine()) != null) { //Leggo la risposta dal buffer e la metto nella stringa response
						response += s;
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			ricercaFinita = true;
			return response;
		}

		@Override
		protected void onPostExecute(String result) {
			xml = result; //salviamo il risultato della ricerca nella variabile globale
			
		}
	}

	public void readWebpage(String artist, String album, String title,String year) { //La funzione prepara la Query che viene Passata nell'AsyncTask che fa la richiesta Http

		LastFmSearch search = new LastFmSearch();
		String query = "";
		if (title != null && !title.equals("") && !artist.equals("") && artist != null) { //La ricerca ha bisogno almeno dell'artista e del titolo, se non ci sono facciamo vedere un messaggio di errore
			
			query += "track.getInfo&"    //Prepariamo la Query
					+ LAST_FM_API_KEY
					+ "&"
					+ ((artist != null && !artist.equals("")) ? ("artist="
							+ artist + "&") : "") + "track=" + title;
			query = query.replaceAll(" ", "+");
			
			

		} else {
			AlertDialog alertDialog = new AlertDialog.Builder(Mp3Activity.this) //Messaggio di errore se non ci sono l'artista e il titolo
					.create();
			alertDialog.setTitle(getString(R.string.Warning));
			alertDialog.setMessage(getString(R.string.AddTitleArtista));
			alertDialog.setIcon(R.drawable.warning);
			alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {

					// Al click di Ok non devo fare niente, quindi lo lasciamo vuoto

				}
			});

			alertDialog.show(); // Mostriamo il messaggio
		}
		if (query.length() > 0) // Dopo aver creato la Query la facciamo eseguire dall'AsyncTask
			search.execute(new String[] { "http://ws.audioscrobbler.com/2.0/?method="
					+ query });
		

	}

	
	// }
	public String artistParseXML(String xml) throws ParserConfigurationException, SAXException, IOException {
		 // Parsiamo il file Xml ricavandone L'artista
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //DocumentBuilderFactory e DocumentBilder le utilizziamo come oggetto "d'appoggio" per poter creare un document da stringa
		DocumentBuilder db;
		String result = null; //Stringa di ritorno
		InputSource inStream = new InputSource();
		inStream.setCharacterStream(new StringReader(xml)); //Creiamo un ImpuTSource dalla stringa xml
		Document doc;
		db = factory.newDocumentBuilder(); //Creo il DocumentBilder dal DocumentBilderFactory
		doc = db.parse(inStream);  //Creo il Document che andremo a parsare attraverso inStream che contiene la stringa xml

		NodeList nl = doc.getElementsByTagName("name"); // Il Tag che ci serve e "name" che sta sotto il Tag "artist"

		for (int i = 0; i < nl.getLength(); i++) { //Analizzo tutti i Tag "name" e prendo l'informazione
			if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE && i == 1) { //nl.item(i).getNodeType() deve essere un nodo, e inoltre prendo i==1 in quanto l'artista sta sotto il primo Tag name
				org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i);
				result = nameElement.getFirstChild().getNodeValue().trim(); //Prendo il valore
			}
		}
		return result; //Ritorno il risultato
	}

	public String titleParseXML(String xml) throws ParserConfigurationException, SAXException, IOException {
		 // Parsiamo il file Xml ricavandone il titolo con lo stesso procedimento dell'artista
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder db;
		String result = null;
		InputSource inStream = new InputSource();
		inStream.setCharacterStream(new StringReader(xml));
		Document doc;
		db = factory.newDocumentBuilder();
		doc = db.parse(inStream);

		NodeList nl = doc.getElementsByTagName("name");
		boolean trovato = true;
		for (int i = 0; i < nl.getLength() && trovato; i++) {
			if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
				org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i);
				result = nameElement.getFirstChild().getNodeValue().trim();
				trovato = false;
			}
		}
		return result;
	}

	public String albumParseXML(String xml)throws ParserConfigurationException, SAXException, IOException {
		// Parsiamo il file Xml ricavandone lalbum con lo stesso procedimento dell'artista
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder db;
		String result = null;
		InputSource inStream = new InputSource();
		inStream.setCharacterStream(new StringReader(xml));
		Document doc;
		db = factory.newDocumentBuilder();
		doc = db.parse(inStream);

		NodeList nl = doc.getElementsByTagName("title");
		for (int i = 0; i < nl.getLength(); i++) {
			if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
				org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i);
				result = nameElement.getFirstChild().getNodeValue().trim();
			}
		}
		return result;
	}

	public String imageParseXML(String xml)throws ParserConfigurationException, SAXException, IOException {
		// Parsiamo il file Xml ricavandone la Url dell?immagine con lo stesso procedimento dell'artista
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder db;
		String result = null;
		InputSource inStream = new InputSource();
		inStream.setCharacterStream(new StringReader(xml));
		Document doc;
		db = factory.newDocumentBuilder();
		doc = db.parse(inStream);

		NodeList nl = doc.getElementsByTagName("image");
		for (int i = 0; i < nl.getLength(); i++) {
			if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
				org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i);
				result = nameElement.getFirstChild().getNodeValue().trim();
			}
		}
		return result;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) { // Assegniamo al menu il layout
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) { //Implementiamo i pulsanti del Layout
		switch (item.getItemId()) {
		case R.id.update: {   //Caso in cui l'utente clicca il pulsante "Update metadata"
			final Dialog dialog1 = new Dialog(Mp3Activity.this); // Apriamo una finestra di dialogo per poter permettere all'utente di modificare i dati della ricerca
			dialog1.setContentView(R.layout.insert_update_dialog);
			dialog1.setTitle(getString(R.string.Modifyfieldsofresearch));
			dialog1.setCancelable(true);

			TextView modifyArtistText = (TextView) dialog1.findViewById(R.id.editTextArtista);
			modifyArtistText.setText(artist);

			TextView modifyTitleText = (TextView) dialog1.findViewById(R.id.editTextTitolo);
			modifyTitleText.setText(title);

			TextView modifyAlbumText = (TextView) dialog1.findViewById(R.id.editTextAlbum);
			modifyAlbumText.setText(album);

			TextView modifyAnnoText = (TextView) dialog1.findViewById(R.id.editTextAnno);
			modifyAnnoText.setText(year);

			Button buttonSearch = (Button) dialog1.findViewById(R.id.bSearchModifyData); // Se l'utente clicca in Search effettuiamo la ricerca con i campi passati dell'utente
			buttonSearch.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {

					TextView modifyArtistText = (TextView) dialog1.findViewById(R.id.editTextArtista); //Leggiamo i dati passati dall'utente
					tempartist = modifyArtistText.getText() + "";

					TextView modifyAlbumText = (TextView) dialog1.findViewById(R.id.editTextAlbum);
					tempalbum = modifyAlbumText.getText() + "";

					TextView modifyTitleText = (TextView) dialog1.findViewById(R.id.editTextTitolo);
					temptitle = modifyTitleText.getText() + "";

					TextView modifyAnnoText = (TextView) dialog1.findViewById(R.id.editTextAnno);
					tempyear = modifyAnnoText.getText() + "";
					year = tempyear;
					dialog1.dismiss();

					readWebpage(tempartist, tempalbum, temptitle, tempyear); //Effettuiamo la ricerca attraverso lastfm
					ParseXml parse = new ParseXml(); //Dichiariamo ed eseguiamo L'AsyncTask che farà il parse
					parse.execute("");

				}
			});

			Button buttonCancel = (Button) dialog1.findViewById(R.id.bCancelData); //Se l'utente clicca su annulla chiudiamo la finestra di dialogo
			buttonCancel.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					dialog1.dismiss();
				}
			});

			dialog1.show();

			break;
		}

		}
		return true;
	}

	private class ParseXml extends AsyncTask<String, Void, String> { //Async Task che effettua il Path
		@Override
		protected String doInBackground(String... urls) {
			String response = "";
			boolean condizione = true;
			while (condizione) { //Tentiamo di fare il parse fino a quando la ricerca http non è finita
				if (ricercaFinita) { //Facciamo il parse solo quando la ricerca è finita
					try {
						newArtist = artistParseXML(xml); //Parsiamo il risultato ricavandone i dati
						newTitle = titleParseXML(xml);
						newImagePath = imageParseXML(xml);
						newAlbum = albumParseXML(xml);
						if (newArtist == null) // Se la ricerca non ha portato i risultati lasciamo come possibili risultati i dati che ha messo l'utente per effettuare la ricerca
							newArtist = tempartist;
						if (newTitle == null)
							newTitle = temptitle;
						if (newAlbum == null)
							newAlbum = tempalbum;
						if (newImagePath != null) { //Se l'image è stata trovata la scarichiamo
							img = getBitmapFromURL(newImagePath); //scarichiamo l'immagine
							
						}else img=null;
						condizione = false; //Abbiamo finito di Parsare
						ricercaFinita = false;
					} catch (ParserConfigurationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (SAXException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
			return response;
		}

		@Override
		protected void onPostExecute(String result) { //Appena finita la ricerca proponiamo all'utente i dati trovati e in caso accetti aggiorniamo i metadati principali
			final Dialog dialog = new Dialog(Mp3Activity.this);
			dialog.setContentView(R.layout.update_dialog); //Creiamo una finestra di dialogo per far vedere all'utente i dati temporanei trovato
			dialog.setTitle(getString(R.string.DoyouWantUpdate));
			dialog.setCancelable(true);

			TextView newTitoloText = (TextView) dialog.findViewById(R.id.newTitolo); //Facciamo vedere i dati trovati per farli eventualmente confermare dall'utente
			newTitoloText.setText(Html.fromHtml("<b> " +getString(R.string.Title)+" </b> " + newTitle));

			TextView newAlbumText = (TextView) dialog.findViewById(R.id.newAlbum);
			newAlbumText.setText(Html.fromHtml("<b> " +getString(R.string.Album)+" </b> " + newAlbum));

			TextView newAnnoText = (TextView) dialog.findViewById(R.id.newAnno);
			newAnnoText.setText(Html.fromHtml("<b> " +getString(R.string.Year)+" </b> " + year));

			TextView newArtistText = (TextView) dialog.findViewById(R.id.newAutore);
			newArtistText.setText(Html.fromHtml("<b>" +getString(R.string.Artist)+" </b> "+ newArtist));

			ImageView newImageAlbum = (ImageView) dialog.findViewById(R.id.newImage);

			if (img != null)
				newImageAlbum.setImageBitmap(img);
			else newImageAlbum.setImageBitmap(cover);

			Button buttonCancel = (Button) dialog.findViewById(R.id.bCancel);
			buttonCancel.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					dialog.dismiss(); // se l'utente clicca sul pulsante "cancel" la finestra di dialogo scompare e non vengono aggiornati i dati
				}
			});
			Button buttonUpdate = (Button) dialog.findViewById(R.id.bUpdate);
			buttonUpdate.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) { //Se accetta i dati
					artist = newArtist; //Assegniamo i dati trovati alle variabili principali
					album = newAlbum;
					title = newTitle;
					cover = img;
					TextView titoloView = (TextView) findViewById(R.id.TitoloText); //Aggiorniamo la Acticity principale
					titoloView.setText(Html.fromHtml("<b> " +getString(R.string.Title)+" </b> "+ title));

					TextView albumView = (TextView) findViewById(R.id.AlbumText);
					albumView.setText(Html.fromHtml("<b> " +getString(R.string.Album)+" </b> " + album));

					TextView annoView = (TextView) findViewById(R.id.AnnoText);
					annoView.setText(Html.fromHtml("<b> " +getString(R.string.Year)+" </b> " + year));

					TextView artistaView = (TextView) findViewById(R.id.AutoreText);
					artistaView.setText(Html.fromHtml("<b> " +getString(R.string.Artist)+" </b> "+ artist));
					ImageView copertina = (ImageView) findViewById(R.id.imageview);

					if (cover != null)
						copertina.setImageBitmap(cover);
					dialog.dismiss();
				}
			});
			dialog.show();
		}
	}

	public static Bitmap getBitmapFromURL(String src) { // La Funzione scarica la Bitmap dal un URl passata come parametro
		try {
			URL url = new URL(src);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // Instaura la connessione Http
			connection.setDoInput(true);
			connection.connect();
			InputStream input = connection.getInputStream(); //Prendiamo il risultato della connessione
			Bitmap myBitmap = BitmapFactory.decodeStream(input); //Trasformiamo l'imput di letto in una BitMap

			return myBitmap;

		} catch (IOException e) {
			e.printStackTrace();
			Log.e("Exception", e.getMessage());
			return null;
		}
	}

}
